﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TCC_Hotel.Entidades;
using TCC_Hotel.Serviços.BDServices;
using System.Drawing;

namespace TCC_Hotel.Apresentacao.Apartamentos
{
    public partial class ListarApartamentos : System.Web.UI.Page
    {
        List<Apartamento> apartamentos = null;
        ApartamentoService servico = new ApartamentoService();
        LoginService servico_Login = new LoginService();

        /// <summary>
        /// Carregamento da página
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();

            LoginService servico_Login = new LoginService();
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Listar_Apartamento)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Cadastrar_Apartamento)
            {
                //Redireciona para a pagina inicial
                btnCadastrar.Visible = false;

                //tira as colunas nao permitida do usuario
                for (int i = 0; i < grdApartamento.Columns.Count; i++)
                {
                    if (grdApartamento.Columns[i].AccessibleHeaderText == "Excluir" || grdApartamento.Columns[i].AccessibleHeaderText == "Editar")
                    {
                        grdApartamento.Columns[i].Visible = false;
                    }
                }

               
            }

            if (!IsPostBack)
            {
                //limpa o chache existente para pegar os dados mais atualizados
               // HttpContext.Current.Cache.Remove("Lista_Apartamentos");

                //recupera todos os funcionarios do banco de dados          
                ReloadGridView();
            }
        }

        /// <summary>
        /// Evento do botão de filtrar os nomes para facilitar a busca
        /// </summary>
        protected void btnBusca_Click(object sender, EventArgs e)
        {
            ReloadGridView();
        }

        /// <summary>
        /// Limpa a busca
        /// </summary>
        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            txtBusca.Text = null;
            ReloadGridView();
        }

        /// <summary>
        /// Lança um popup em javaScript com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJS(string msg)
        {            
            //Formata um alert para o usuário
           Page.ClientScript.RegisterStartupScript(

                    this.GetType(),

                    "error",

                    "$(window).load(function(){alert('" + msg + "')});",

                    true);
            
        }

        /// <summary>
        /// Evento de click em algum dos botões 
        /// </summary>
        protected void grdApartamento_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            int numero;

            //Verifica qual o botão que o usuário clicou
            if (e.CommandName == "detalharApartamento")
            {
                numero = Convert.ToInt32(grdApartamento.Rows[Convert.ToInt16(e.CommandArgument)].Cells[0].Text);

                //Redireciona para a pagina de detalhes correspondente com o numero como parametro
                Response.Redirect("~/Apresentacao/Apartamentos/DetalharApartamento.aspx?numero=" + numero);

            }
            else if (e.CommandName == "editarApartamento")
            {
                numero = Convert.ToInt32(grdApartamento.Rows[Convert.ToInt16(e.CommandArgument)].Cells[0].Text);

                if (!servico.VerificarReservaApartamento(numero))
                {
                    //Redireciona para a pagina de editar correspondente com o CPF como parametro
                    Response.Redirect("~/Apresentacao/Apartamentos/EditarApartamento.aspx?numero=" + numero);
                }
                else
                {
                    ReloadGridView();
                    MensagemJS("ERRO: Não é possivel editar o apartamento porque existem reservas nele.");
                    
                }
            }
            else if (e.CommandName == "excluirApartamento")
            {
                numero = Convert.ToInt32(grdApartamento.Rows[Convert.ToInt16(e.CommandArgument)].Cells[0].Text);

                if (!servico.VerificarReservaApartamento(numero))
                {
                    //chama o servico que exclui o apartamento do hotel e verifica se o apartamento foi excluido
                    if (servico.ExcluirApartamento(numero))
                    {
                        //Remove o cache para atualizar informação
                        HttpContext.Current.Cache.Remove("Lista_Apartamentos");

                        MensagemJS("Apartamento excluído!");
                        ReloadGridView();
                    }
                    else
                    {
                        MensagemJS("ERRO: Ocorreu um erro e o apartamento não foi excluído!");
                        ReloadGridView();
                    }
                }
                else
                {
                    MensagemJS("ERRO: Não é possivel excluir o apartamento porque existem reservas nele.");
                    ReloadGridView();
                }
            }
            else if (e.CommandName == "liberarApartamento")
            {
                numero = Convert.ToInt32(grdApartamento.Rows[Convert.ToInt16(e.CommandArgument)].Cells[0].Text);

                if (servico.EditarDisponibilidadeApartamento(numero, true))
                {
                    //Remove o cache para atualizar informação
                    HttpContext.Current.Cache.Remove("Lista_Apartamentos");
                    MensagemJS("Apartamento liberado com sucesso!");
                }
                //Faz o reload da pagina para não perder os valores 
                ReloadGridView();
            }
        }

        /// <summary>
        /// Evento que controla a paginação e verifica o cache
        /// </summary>
        protected void grdApartamento_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            //Consulta os apartamentos no serviço. Nele será verificado o cache
            apartamentos = servico.ListarApartamentosCache();

            apartamentos = apartamentos.Where(i => i.Nome.ToUpper().Contains(txtBusca.Text.ToUpper())).OrderBy(j => j.Numero).ToList();


            //Na mudança de pagina, chama o evento de aparecer a lista
            grdApartamento.PageIndex = e.NewPageIndex;
            grdApartamento.DataSource = apartamentos;
            grdApartamento.DataBind();
        }

        /// <summary>
        /// Faz o reload do gridview quando necessário e consulta o cache
        /// </summary>
        private void ReloadGridView()
        {

            //Consulta os apartamentos no serviço. Nele será verificado o cache
            apartamentos = servico.ListarApartamentosCache();

            //ordenando por qntmaxima de hospede e por nome
            apartamentos = apartamentos.Where(i => i.Nome.ToUpper().Contains(txtBusca.Text.ToUpper())).OrderBy(j => j.Numero).ToList();


            //popular gridView ordenando por qntmaxima de hospede e por nome
            grdApartamento.DataSource = apartamentos;
            grdApartamento.DataBind();

        }

        /// <summary>
        /// Evento do botão de cadastrar que chama a tela de cadastro
        /// </summary>
        protected void btnCadastrar_Click(object sender, EventArgs e)
        {
            Apartamento apartamento = servico.ListarApartamentosCache().OrderByDescending(i => i.Numero).FirstOrDefault();
            int proximo = 1;
            if (apartamento != null)
            {
                proximo = apartamento.Numero + 1;
            }
          
            //Redireciona para a pagina de cadastro
            Response.Redirect("~/Apresentacao/Apartamentos/CadastrarApartamento.aspx?proximoNumero=" + proximo);

        }

        /// <summary>
        /// Evento chamado a cada nova linha criada. O evento verificará se o apartamento esta livre e indisponível. Se sim
        /// ele habilita o botão de liberar, ou se não deixa desabilitado
        /// </summary>
        protected void grdApartamento_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            bool value;
            int numero = 0;
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                //Pega o valor correspondente a coluna Disponibilidade e numero
                value = Convert.ToBoolean(DataBinder.Eval(e.Row.DataItem, "Disponibilidade"));
                numero = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Numero"));

                ((LinkButton)e.Row.Cells[6].Controls[0]).OnClientClick = "return confirm('Deseja realmente excluir o apartamento " + numero + "?');";


                //Se value for false verifica se ele esta ocupado
                if (value == false)
                {
                    //se ele estiver ocupado
                    if (servico.VerificarOcupacaoApartamento(numero))
                    {
                        e.Row.Cells[7].Text = "Ocupado";
                        e.Row.Cells[7].ForeColor = Color.Red;
                        e.Row.Cells[7].BorderColor = Color.DarkBlue;
                    }
                }
                else
                {
                    e.Row.Cells[7].Text = "Livre";
                    e.Row.Cells[7].ForeColor = Color.DarkBlue;
                }
                              
            }


        }

    }
}